#pragma once

#include "ApiUrls.h"
#include "Helper.h"
#include "IHTTPClient.h"
#include "esp_http_client.h"
#include "esp_https_ota.h"
#include "esp_log.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include <string>

// 固件信息结构
typedef struct {
	char package_id[37];		 // 固件ID
	char version[32];			 // 版本号: "1.2.3"
	char tag[32];				 // TAG
	char url[128];				 // URL:固件源有两种类型，一种是平台自带的，一种是外部URL提供的.如果URL不为空，请通过URL下载.
	char checksum[128];			 // 校验值和
	char checksum_algorithm[16]; // 校验方式: MD5,SHA256,SHA384,SHA512,CRC32,MURMUR3_32,MURMUR3_128。默认使用：SHA256
	int data_size;				 // 文件大小
	bool force;					 // 是否强制更新
} ota_firmware_info_t;

class OtaUpdater {
public:
	// 构造函数
	OtaUpdater();

	// 析构函数
	~OtaUpdater();

	// 检查更新
	bool checkForUpdate();

	// 执行OTA更新
	bool performUpdate();

	// 设置超时时间
	void setTimeout(int timeout_ms);

	// 获取错误信息
	const std::string &getError() const;

	// 静态方法：获取当前固件版本
	static std::string getCurrentFirmwareVersion();

private:
	// 验证固件头部信息，是否一致
	esp_err_t validateImageHeader(esp_app_desc_t *app_desc);
	// HTTP事件处理
	static void eventHandler(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data);
	ota_firmware_info_t m_ota_firmware_info;
	IHTTPClient *m_http_client;
	std::string error_message_;
	int timeout_ms_ = 5000;
	bool update_available_;
};